package com.macro.mall.tiny.service.impl;

import com.macro.mall.tiny.common.api.CommonResult;
import com.macro.mall.tiny.service.RedisService;
import com.macro.mall.tiny.service.UmsMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Random;

/**
 * 会员管理Service实现类
 * Created by LKim on 2022/6/21.
 */
@Service
public class UmsMemberServiceImpl implements UmsMemberService {

    @Autowired
    private RedisService redisService;

    @Value("${redis.key.prefix.authCode}")
    private String REDIS_KEY_PREFIX_AUTH_CODE;

    @Value("${redis.key.expire.authCode}")
    private Long AUTH_CODE_EXPIRE_SECONDS;

    /**
     * 生成验证码时，将自定义的Redis键值加上手机号生成一个Redis的key
     * 以验证码为value存入到Redis中，并设置过期时间为自己配置的时间（这里为120s）。
     * 校验验证码时根据手机号码来获取Redis里面存储的验证码，并与传入的验证码进行比对。
     */

    /**
     * 生成验证码时，将自定义的Redis键值加上手机号生成一个Redis的key
     * 以验证码为value存入到Redis中，并设置过期时间为自己配置的时间（这里为120s）。
     * @param telephone 手机号
     * @return
     */
    @Override
    public CommonResult generateAuthCode(String telephone) {
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            //生成6个范围在10以内的随机数作为验证码
            sb.append(random.nextInt(10));
        }
        String phone_authCode = REDIS_KEY_PREFIX_AUTH_CODE + telephone;
        //验证码绑定手机号并存储到Redis中
        redisService.set(phone_authCode, sb.toString());
        //为绑定手机号的验证码设置TTL
        redisService.expire(phone_authCode, AUTH_CODE_EXPIRE_SECONDS);
        return CommonResult.success(sb.toString(), "获取验证码成功");
    }

    /**
     * 校验验证码时根据手机号码来获取Redis里面存储的验证码，并与传入的验证码进行比对。
     * @param telephone 手机号
     * @param authCode 验证码
     * @return
     */
    @Override
    public CommonResult verifyAuthCode(String telephone, String authCode) {
        authCode = authCode.trim();
        if(StringUtils.isEmpty(authCode)){
            return CommonResult.failed("验证码不能为空白");
        }
        String realCode = redisService.get(REDIS_KEY_PREFIX_AUTH_CODE + telephone);
        boolean result = authCode.equals(realCode);
        if(result){
            return CommonResult.success(null, "验证码校验成功");
        }else{
            return CommonResult.failed("验证码不正确");
        }
    }
}
